package rbac.service;

import rbac.domain.dto.RoleDto;
import rbac.domain.entity.Role;
import rbac.domain.vo.RoleVo;
import rbac.domain.vo.Result;

import java.util.Arrays;

/**
 * 业务层-角色管理模块
 */

public class RoleService {
    public static int DATA_SIZE = 100; // 实体对象存储量设为最多100个
    public static Role[] data = new Role[DATA_SIZE + 1]; // 实体类的Role领域对象
    public static int idCounter = 1;

    public static Result list(){
        RoleVo[] temp = new RoleVo[DATA_SIZE]; // 创建⼀个临时数组，⽤于存储有效的角色数据
        int length = 0; // ⽤于记录临时数组的实际存储⻓度

        for (int i = 1; i < idCounter; i++){
            if (data[i] != null){
                temp[length++] = convertToVo(data[i]);
            }
        }
        return Result.success(" 查询成功", Arrays.copyOf(temp, length)); // 返回临时数组的有效部分
    }

    public static Role createEntity(RoleDto dto, int id){
        Role role = new Role(dto.name, dto.dataScope); // 创建新的角色对象，使⽤传⼊的角色名称和数据访问范围

        role.id = id; // 给每个角色分配唯一的id

        return role;
    }

    public static Result create(RoleDto dto){ // 用dto数据传输对象来传入参数
        if (idCounter > DATA_SIZE){
            return Result.failure("创建失败，超出存储容量");
        }

        Role role = createEntity(dto, idCounter++);

        data[role.id] = role; // 将新角色对象存储到数据数组中

        return Result.success(" 创建成功", null);
    }

    // 将角色实体对象转换为角色视图对象
    public static RoleVo convertToVo(Role role){
        // 通过类名直接调⽤，⽆需创建 RoleService类的实例
        return new RoleVo(role.id, role.name, role.dataScope);
    }

    public static boolean existsById(int id){
        return id >= 1 && id < idCounter && data[id] != null;
    }

    public static void updateEntity(RoleDto dto, Role role) {
        role.name = dto.name; // 原来在实体类的数据 -->-替换-> 刚刚输入在dto类的数据
        role.dataScope = dto.dataScope;
    }

    public static Result update(RoleDto dto, int id){
        if (!existsById(id)){
            return Result.failure("更新失败，不存在该数据");
        }

        Role role = data[id]; // 获取指定ID 的角色对象

        updateEntity(dto, role);

        return Result.success(" 更新成功", null);
    }

    public static Result delete(int id){
        if (!existsById(id)){
            return Result.failure("删除失败，不存在该数据");
        }

        // 将指定ID的角色数据置为 null，表示删除该数据
        data[id] = null;

        return Result.success("删除成功", null);
    }

}

